<?php
/**
 * IAuth 相关
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/6/5
 * Time: 0:22
 */

namespace app\common\lib;

use think\Cache;

class IAuth{

    /**
     * 设置密码
     * @param $pass
     * @param $randChar
     * @return string
     */
    static function setMdPassword($pass,$randChar){
        return md5(md5(trim($pass)).$randChar);
    }

    /**
     * 设置密码加密
     * @param $pass
     * @return mixed
     */
    static function encrypt($pass){
        $randChar = self::getEncryptString(6);
        $password = self::setMdPassword($pass,$randChar);

        $data['rand'] = $randChar;
        $data['pass'] = $password;

        return $data;
    }

    /**
     * 管理员/用户 密码随机秘钥
     * @param int $length
     * @return string
     */
    static function getEncryptString( $length = 6 ) {
        // 密码字符集，可任意添加你需要的字符
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $password = '';
        for ( $i = 0; $i < $length; $i++ )
        {
            // 这里提供两种字符获取方式
            // 第一种是使用 substr 截取$chars中的任意一位字符；
            // 第二种是取字符数组 $chars 的任意元素
            // $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
            $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
        }
        return $password;
    }

    /**
     * 生成每次请求的 sign
     * @param array $data
     * @return string
     */
    public static function setSign($data = []){
        // 1 按字段排序
        ksort($data);
        // 2 拼接字符串数据 &
        $string = http_build_query($data);
        //通过 aes 来加密
        $string = (new Aes())->encrypt($string);
        // 4 所有字符转化大写
        //$string = strtoupper($string);
        return $string;
    }

    /**
     * 检查sign 是否正常
     * @param array $data
     * @return bool
     */
    public static function checkSignPass($data){
        $str = (new Aes())->decrypt($data['sign']);

        if (empty($str)){
            return false;
        }
        //参数转化为数组
        parse_str($str,$arr);
        if(!is_array($arr) || empty($arr['did']) || $arr['did'] != $data['did']){
            return false;
        }

        if (!config('app_debug')) {
            //检查时间是否在规定时间内
            if ((time() - ceil($arr['time'] / 1000)) > config('app.app_sign_time')) {
                return false;
            }
            //唯一性判定
            if (Cache::get($data['sign'])) {
                return false;
            }
        }
        //... 等待
        return true;
    }

    /**
     * 设置登录的token，  唯一性的
     * @param string $phone
     * @return string
     */
    public static function setAppLoginToken($phone = ''){
        $str = md5(uniqid(md5(microtime(true)), true));
        $str = sha1($str, $phone);
        return $str;
    }

}